嗨大家今天過得好嗎?昨天了解了 ViewPager 的基本功能、滑動動畫還有無限自動輪播,今天想來聊聊 Google 在 2019 年再推出升級版的 ViewPager2 有哪些改變還有如何升級?
在 ViewPager2 的世界裡滑動的動畫一樣是透過 PageTransformer
實現,提供 View 和 position 的參數可以設定動畫,但不同的是原先的 PagerAdapter
換成大家更熟悉的 RecyclerView.Adapter
;如果分頁是一個一個的 Fragment 原來的 Adapter 也從 FragmentStatePagerAdapter
換成 FragmentStateAdapter
;最後是監聽 ViewPager 滑動事件 registerOnPageChangeCallback
取代了 addPageChangeListener
,官方列出 ViewPager2 主要新增了下列幾項功能:
notifyDataSetChanged()
看到第一點的新功能原先有點疑惑,疑惑的點是 ViewPager 原來就可以向左向右滑,那 ViewPager2 新增支援的 RTL 是什麼意思?後來才發現這是我 LTR ( Left To Right ) 本位主義的想法,有些語言就是由右至左的方式書寫的,因此第一頁也會從最右邊起算,但原來的 ViewPager 並沒有支援。在 ViewPager2 新增 android:layoutDirection
的屬性,只要設為 rtl
就可以實現右至左排列的功能。垂直滑動在 ViewPager2 也可以輕易實現,只要新增 android:orientation
的屬性設定為 vertical
就完成。
還記得原來 ViewPager 的機制是在 instantiateItem
的 method 中畫出 View 和綁定位置的嗎?因為 PagerAdapter 並不清楚綁定的 View 是誰?安好嗎?幾歲?住哪?要改變已經創建好的 View 就要全部砍掉重練,先全部移除後再重建一次,這樣搞誰受得了?因此後來推出的 ViewPager 才有支援比較完整的 notifiDataSetChanged()
機制,這點應該不算新功能比較像 bug fix 吧?因為 Adapter 已經換成 RecyclerView.Adapter
,Adapter 對 ViewHolder 的掌握度就比原先 PagerAdapter 來得高,使用 notifyDataSetChanged()
才有效果。
主要修改專案中使用到 ViewPager 的幾個地方:
看到官方有繼續推出新版本、升級 ViewPager 還是挺好的,如果專案有用到 ViewPager 的話也要找機會更新到最新的 ViewPager2,才能讓 ViewPager 的功能持續升級越來越好用。喜歡今天分享內容的邦友請繼續關注「打造一個厲害的普通 Android App - 使用者體驗優化」的主題,我們明天見。